/**
 * Excel 导出工具
 * 基于 xlsx 库实现表格数据导出
 */
import * as XLSX from 'xlsx'

/**
 * 导出表格数据为 Excel 文件
 * @param {Object} options 配置选项
 * @param {Array} options.columns - 列配置（Ant Design Vue Table 格式）
 * @param {Array} options.dataSource - 数据源
 * @param {String} options.fileName - 文件名（不含扩展名），默认为 'export'
 * @param {String} options.sheetName - sheet 名称，默认为 'Sheet1'
 * @param {Array} options.excludeKeys - 要排除的列 key，默认排除 'action'
 */
export function exportTableToExcel(options = {}) {
  const {
    columns = [],
    dataSource = [],
    fileName = 'export',
    sheetName = 'Sheet1',
    excludeKeys = ['action']
  } = options

  try {
    // 过滤掉不需要导出的列（如操作列）和不可见的列
    const exportColumns = columns.filter(col => {
      const key = col.key || col.dataIndex
      // 排除指定的列和不可见的列
      return !excludeKeys.includes(key) && col.visible !== false
    })

    // 如果没有可导出的列，提示错误
    if (exportColumns.length === 0) {
      throw new Error('没有可导出的列')
    }

    // 构建表头
    const headers = exportColumns.map(col => col.title || '')

    // 构建数据行
    const rows = dataSource.map(record => {
      return exportColumns.map(col => {
        const key = col.dataIndex || col.key
        let value = record[key]

        // 优先使用自定义导出函数
        if (typeof col.customExport === 'function') {
          try {
            value = col.customExport(value, record)
          } catch (error) {
            console.error('自定义导出函数执行失败:', error)
          }
        }
        // 其次使用自定义渲染函数（如果有）
        else if (typeof col.customRender === 'function') {
          try {
            const rendered = col.customRender({ text: value, record, index: 0 })
            // 如果返回的是对象（VNode），尝试提取文本
            if (rendered && typeof rendered === 'object') {
              value = rendered.children || rendered.props?.children || value
            } else {
              value = rendered
            }
          } catch (error) {
            console.error('自定义渲染函数执行失败:', error)
          }
        }

        // 处理特殊值
        if (value === null || value === undefined) {
          return ''
        }

        // 如果是对象或数组，转为 JSON 字符串
        if (typeof value === 'object') {
          return JSON.stringify(value)
        }

        return String(value)
      })
    })

    // 合并表头和数据
    const data = [headers, ...rows]

    // 创建工作表
    const worksheet = XLSX.utils.aoa_to_sheet(data)

    // 设置列宽（自适应）
    const colWidths = exportColumns.map((col, index) => {
      // 计算该列的最大宽度
      let maxWidth = (col.title || '').length
      rows.forEach(row => {
        const cellValue = String(row[index] || '')
        if (cellValue.length > maxWidth) {
          maxWidth = cellValue.length
        }
      })
      // 限制最大宽度为 50
      return { wch: Math.min(maxWidth + 2, 50) }
    })
    worksheet['!cols'] = colWidths

    // 创建工作簿
    const workbook = XLSX.utils.book_new()
    XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)

    // 导出文件
    const timestamp = new Date().getTime()
    const fullFileName = `${fileName}_${timestamp}.xlsx`
    XLSX.writeFile(workbook, fullFileName)

    return {
      success: true,
      fileName: fullFileName,
      message: '导出成功'
    }
  } catch (error) {
    console.error('导出Excel失败:', error)
    return {
      success: false,
      error: error.message,
      message: '导出失败'
    }
  }
}

/**
 * 导出自定义数据为 Excel 文件
 * @param {Object} options 配置选项
 * @param {Array} options.data - 二维数组数据
 * @param {String} options.fileName - 文件名
 * @param {String} options.sheetName - sheet 名称
 */
export function exportDataToExcel(options = {}) {
  const {
    data = [],
    fileName = 'export',
    sheetName = 'Sheet1'
  } = options

  try {
    if (!data || data.length === 0) {
      throw new Error('没有可导出的数据')
    }

    // 创建工作表
    const worksheet = XLSX.utils.aoa_to_sheet(data)

    // 创建工作簿
    const workbook = XLSX.utils.book_new()
    XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)

    // 导出文件
    const timestamp = new Date().getTime()
    const fullFileName = `${fileName}_${timestamp}.xlsx`
    XLSX.writeFile(workbook, fullFileName)

    return {
      success: true,
      fileName: fullFileName,
      message: '导出成功'
    }
  } catch (error) {
    console.error('导出Excel失败:', error)
    return {
      success: false,
      error: error.message,
      message: '导出失败'
    }
  }
}

